package visiopuce.ui.providers;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;

import visiopuce.objets.Analyse;
import visiopuce.objets.Champ;
import visiopuce.objets.Personne;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Puce;
import visiopuce.objets.Resultat;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.PuceServiceImpl;
import visiopuce.service.ResultatServiceImpl;

public class ListeADNTableLabelProvider extends ColumnLabelProvider implements IColorProvider {

	private int colindex;

	/** Constructeur privé */
	public ListeADNTableLabelProvider(int colindex) {
		this.colindex = colindex;
	}

	@Override
	public String getText(Object element) {
		String result = "";
		Analyse analyse = (Analyse) element;
		Prelevement prel = PrelevementServiceImpl.getInstance().getPrelevementById(analyse.getPrelevement().getIdPrelevement());
		Personne personne = PersonneServiceImpl.getInstance().getPersonneById(prel.getPersonne().getIdPersonne());
		List<Resultat> resultats = ResultatServiceImpl.getInstance().findAllByidAnalyse(analyse.getIdAnalyse());
		List<Puce> puces = PuceServiceImpl.getInstance().findAllByidAnalyse(analyse.getIdAnalyse());

		SimpleDateFormat formatDateJava = new SimpleDateFormat("dd/MM/yyyy");
		Champ ctRangementADN = null;
		if (prel != null) {
			ctRangementADN = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tRangement", "Prel-" + prel.getIdPrelevement());
		}
		Date dExt = null;
		Champ cdateExtraction = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("dateExtraction", "Prel-" + prel.getIdPrelevement());
		if (cdateExtraction != null) {
			SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
			try {
				dExt = formater.parse(cdateExtraction.getValeur());
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		switch (colindex) {
		case 0:
			result = personne.getNom();
			break;
		case 1:
			result = personne.getPrenom();

			break;
		case 2: {
			if (personne.getDateNaissance() != null) {
				result += formatDateJava.format(personne.getDateNaissance());
			}
			break;
		}
		case 3:
			result = prel.getNumeroPrelevement();
			break;
		case 4:
			for (Resultat resultat : resultats) {
				if (resultat.getDateRendu() != null) {
					result += formatDateJava.format(resultat.getDateRendu()) + " ";
				}
			}
			break;
		case 5:
			if (prel.getDatePrelevement() != null) {
				result = formatDateJava.format(prel.getDatePrelevement());
			}
			break;
		case 6:
			if (prel.getTypePrelevement() != null) {
				result = prel.getTypePrelevement().getLibelle();
			}
			break;
		case 7: {
			if (prel.getPrescripteur() != null) {
				result = prel.getPrescripteur().getNom();
				if (prel.getPrescripteur2() != null) {
					result += "/" + prel.getPrescripteur2().getNom();
				}
				if (prel.getPrescripteur3() != null) {
					result += "/" + prel.getPrescripteur3().getNom();
				}
				if (prel.getNomPrenomAutrePresc() != null) {
					result += "/" + prel.getNomPrenomAutrePresc();
				}
			}
			break;

		}
		case 8: {
			if (analyse.getTypeAnalyse() != null) {
				result = analyse.getTypeAnalyse().getLibelle();
			}
			break;
		}
		case 9: {
			if (prel.getIndication() != null) {
				result = prel.getIndication().getLibelle();
			}
			break;
		}
		case 10: {
			if (ctRangementADN != null) {
				result = ctRangementADN.getValeur();
			}
			break;
		}
		case 11: {
			if (dExt != null) {
				result = formatDateJava.format(dExt);
			}
			break;
		}
		case 12: {
			// commentaire
			if (analyse.isUrgent()) {
				result = "URGENT";
				if (analyse.getRaisonUrgent() != null) {
					result += " : " + analyse.getRaisonUrgent();
				}
			}
			if (prel.getInfoIndication() != null) {
				result += prel.getInfoIndication();
			}
			break;
		}
		case 13: {
			for (Puce puce : puces) {
				if (puce.getFeuillePuce() != null) {
					result += puce.getFeuillePuce().getIdFeuillePuce() + "(le " + formatDateJava.format(puce.getFeuillePuce().getDateEnvoi()) + ") ";
				}
			}
			break;
		}

		case 14: {
			Champ cSexeFoetus = PrelevementServiceImpl.getInstance().getChampByTypeAndIdObjet("tSexeFoetus", "Prel-" + prel.getIdPrelevement());
			if (cSexeFoetus != null) {
				result = "Sexe foetal : " + cSexeFoetus.getValeur();
			} else {
				result = personne.getSexe();
			}
		}
			break;
		}
		return result.trim();
	}

	@Override
	public Color getBackground(Object element) {
		Color color = new Color(Display.getCurrent(), 255, 255, 255);
		Analyse analyse = (Analyse) element;
		List<Puce> puces = PuceServiceImpl.getInstance().findAllByidAnalyse(analyse.getIdAnalyse());
		boolean faite = false;
		boolean rendu = false;
		for (Puce puce : puces) {
			if (puce.getFeuillePuce() != null) {
				faite = true;
				break;
			}
		}
		if (faite) {
			List<Resultat> resultats = ResultatServiceImpl.getInstance().findAllByidAnalyse(analyse.getIdAnalyse());
			for (Resultat resultat : resultats) {
				if (resultat != null && resultat.getDateRendu() != null && !resultat.getResultat().equals("Echec")) {
					rendu = true;
					break;
				}
			}
		}

		if (analyse.isUrgent() && !faite && !rendu) {
			color = new Color(Display.getCurrent(), 255, 88, 88);
		} else {
			if (faite && !rendu) {
				color = new Color(Display.getCurrent(), 169, 201, 255);
			}
			if (faite && rendu) {
				color = new Color(Display.getCurrent(), 179, 255, 136);
			}
		}

		return color;
	}

}
